package com.lsh.datasource;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

import javax.sql.DataSource;
import java.util.Map;

/**
 * 动态数据源
 * @Date 2021年05月20日10:07:21
 * @author ruoyi
 * 继承 AbstractRoutingDataSource类，重写determineCurrentLookupKey()方法。
 * 可以看到如果当前线程变量没有值，它首先被初始化为默认的值。
 *
 * determineCurrentLookupKey()是AbstractRoutingDataSource类中的一个抽象方法，
 * 而它的返回值是当前线程要用的数据源dataSource的key值，有了这个key值，
 * resolvedDataSource（这是个map,由配置文件中设置好后存入的）就从中取出对应的DataSource，
 * 如果找不到，就用配置默认的数据源。
 *
 * 而我们上面的所有操作都是要扩展AbstractRoutingDataSource类，并重写其中的determineCurrentLookupKey()方法，来实现数据源的切换。
 *
 */
public class DynamicDataSource extends AbstractRoutingDataSource {
    public DynamicDataSource(DataSource defaultTargetDataSource, Map<Object, Object> targetDataSources) {
        super.setDefaultTargetDataSource(defaultTargetDataSource);
        super.setTargetDataSources(targetDataSources);
        super.afterPropertiesSet();
    }

    /**
     * 重写determineCurrentLookupKey()方法
     * @return
     */
    @Override
    protected Object determineCurrentLookupKey() {
        return DynamicDataSourceContextHolder.getDataSourceType();
    }
}